#ifndef __MODULE_INTERFACE_H__
#define __MODULE_INTERFACE_H__

#include "DataStorage.h"
#include "ModuleManager.h"


/*
 *	Makro na pouzitie modulu. Vytvori v kode metodu vracajucu pointer na modul.
 *	Ta ho vytvori a zaregistruje v module manageri, resp. ziska odtial modul ak uz existuje.
 *	Pouzitie: a)do hlavickoveho suboru triedy, kde chceme vlozit modul vlozime hlavickovy subor
 *	modulu: #include "cesta_k_modulu"
 *	b) do casti private v definicii triedy vlozime makro: USE_MODULE(nazovTriedyModulu)
 *	c) v kode sa spravanie pouziva: GetMenoModulu()->metoda_spravania(parametre)
 */
#define USE_MODULE(className) \
	className * Get ## className() \
	{ \
		static className * myInstance = NULL; \
		if(myInstance != NULL) { \
			return myInstance; \
		} \
		else \
		{ \
			ModuleManager::GetInstance().RegisterModule(#className, new className()); \
			myInstance = dynamic_cast<className *> (ModuleManager::GetInstance().GetModule(#className)); \
			return myInstance; \
		} \
	}

/**
 *	Trieda je rozhranim, ktore musia dedit vsetky moduly.
 */
class ModuleInterface
{
public:
	//string name;
	ModuleInterface() {}
	virtual ~ModuleInterface() {}

	/*	V tejto metode je implementovane vlastne spravanie
	 *	ide o zakladne spravanie bez parametrov, v triedach potomkov sa mozu
	 *	vytvarat aj spravania s parametrami. Odporucanie nazvat je menom behave(zoznam parametrov)
	 */
	//virtual void Behave() {}
};

#endif
